package com.infosys.setl.fp.demo2;

import org.apache.commons.functor.UnaryFunction;
import org.apache.commons.functor.adapter.RightBoundFunction;
import org.apache.commons.functor.core.composite.CompositeUnaryFunction;

import com.infosys.setl.fp.demo1.SetlItem;

public class TestB {
    public static void main(String[] args) {
        try {
            double discountRate = 0.1;
            double taxRate = 0.33;
            //calcDiscountedPrice
            UnaryFunction<Double, Double> calcDiscountedPrice
            //通过用 (1 - discountRate)作为其常量第二参数，将二元 Multiply函数适配为一元接口。
            //这种将多参数的函数重新编写为一个参数的函数的合成（composition）技术也称为 currying。
            = new RightBoundFunction<Double, Double>(new Multiply(), new Double(1 - discountRate));
            //calcTax
            UnaryFunction<Double, Double> calcTax
            //通过用 (1 + taxRate)作为其第二个常量参数将二元 Multiply函数适配为一元接口。
            = new RightBoundFunction<Double, Double>(new Multiply(), new Double(1 + taxRate));
            //calcNetPrice,表达式合成,一元合成,第一个仿函数的输出作为第二个仿函数的输入。
            CompositeUnaryFunction<Double, Double> calcNetPrice
            //首先计算折扣价格,再加上销售税计算净价
            //tmpResult=calcDiscountedPrice(x)=x multiply (1-discountRate)
            //result=calcTax(tmpResult)=tmpResult multiply (1+taxTate)
            = new CompositeUnaryFunction<Double, Double>(calcTax).of(calcDiscountedPrice);
            //test
            SetlItem item = new SetlItem("item");
            item.setPrice(100);
            Double netPrice = calcNetPrice.evaluate(new Double(item.getPrice()));
            System.out.println("The net price is: " + netPrice);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
